// 哈夫曼树
#ifndef HUFFMAN_H
#define HUFFMAN_H

typedef char ElemType;

typedef struct HNode
{
	ElemType data;
	int weight;
	HNode *lchild, *rchild, *parent;
} HNode, *HuffmanTree;

/**
 * 构建哈夫曼树时选择两个最小权值的结点
 * @param nodes 传入目前全部结点数组，先开始每个结点视为只有根结点的树，容量为2n-1（哈夫曼树性质：度为0的结点总是比度为2的结点多一个）
 * @param count nodes数组中有效结点个数
 * @param n1 传入一个整型引用以获取第一个被选择的结点的下标
 * @param n2 传入一个整型引用以获取第二个被选择的结点的下标
 */
void select(HNode *, int, int &, int &);

/**
 * 构造一个哈夫曼树
 * @param tree 传入树的引用
 * @param e 传入用于构造树的元素集合
 * @param weight 权值
 * @param count 叶子结点数
 */
void createHuffmanTree(HuffmanTree &, ElemType *, int *, int);

/**
 * 先序遍历哈夫曼树
 * @param tree 传入哈夫曼树指针引用
 * @param visit(HNode*e) 回调函数
 */
void preOrderTraverse(HuffmanTree &, void(HNode *e));

/**
 * 中序遍历哈夫曼树
 * @param tree 传入哈夫曼树指针引用
 * @param visit(HNode*e) 回调函数
 */
void inOrderTraverse(HuffmanTree &, void(HNode *e));

/**
 * 后序遍历哈夫曼树
 * @param tree 传入哈夫曼树指针引用
 * @param visit(HNode*e) 回调函数
 */
void postOrderTraverse(HuffmanTree &, void(HNode *e));

#include "./huffman-tree.cpp"

#endif